﻿Imports System.Data
Imports MyGeneration.dOOdads

Public Class rc_Facturas

    Private _MessageError As Exception = Nothing
    Public Property MessageError() As Exception
        Get
            Return _MessageError
        End Get
        Set(value As Exception)
            _MessageError = value
        End Set
    End Property

    Private log__1 As New Class_RC_Controller.rc_Mantenimiento()

#Region "Ventas"

    Private Property conn As String


    Public Function get_Rango_Factura(conn As String) As String
        Try

            Dim rango As New Class_RC_Data.Class_RC.RANGODOCUMENTOS(conn)
            Dim numero As String = ""
            rango.Where.TipoDocumento.Value = "FACTURA"
            rango.Where.Habilitado.Value = True

            If rango.Query.Load Then
                If rango.DefaultView.Table.Rows.Count > 0 Then

                    numero = rango.Prefijo.ToString() + rango.RangoActual.ToString().PadLeft(7, "0")
                    rango.RangoActual += 1
                    rango.Save()

                    Return numero
                Else
                    Return ""
                End If

            Else
                Return ""

            End If

        Catch ex As Exception
            MessageError = ex
            Return ""
        End Try

    End Function

    Public Function Insert_Ventas(conn As String, nroFactura As String, fecha As DateTime, vto As String, tipoVenta As String,
                                  estadoVenta As String, totalVenta As Decimal, totalSaldo As Decimal, totalIva As Decimal,
                                  codCliente As Integer, codVendedor As Integer, codUsuario As Integer, confirmar As Boolean,
                                  codNota As Integer, descto As Decimal) As Integer

        Dim tx As TransactionMgr

        tx = TransactionMgr.ThreadTransactionMgr()

        Try
            tx.BeginTransaction()

            Dim ventas As New Class_RC_Data.Class_RC.VENTAS(conn)

            ventas.AddNew()

            If nroFactura = "" And (confirmar Or tipoVenta = "CONTADO") Then
                nroFactura = get_Rango_Factura(conn)
            End If

            ventas.NroFactura = nroFactura

            ventas.Fecha = fecha

            If vto <> "" Then
                ventas.Vencimiento = DateTime.Parse(vto)
            End If

            ventas.TipoVenta = tipoVenta
            ventas.EstadoVenta = estadoVenta
            ventas.TotalVenta = totalVenta
            ventas.TotalVentaIVA = totalIva
            ventas.Descto = descto

            If tipoVenta = "CONTADO" Then
                ventas.TotalVentaSaldo = 0
            Else
                ventas.TotalVentaSaldo = ventas.TotalVenta
            End If

            ventas.CodCliente = codCliente
            ventas.CodVendedor = codVendedor
            ventas.CodUsuario = codUsuario
            ventas.FechaActualizacion = DateTime.Now

            If codNota > 0 Then
                ventas.CodNota = codNota
            Else
                ventas.SetColumnNull("CodNota")
            End If

            ventas.Save()
            log__1.Insert_Log(conn, "Inserto registro, codigo: " & ventas.CodVenta, codUsuario, 1, ventas.DefaultView.Table)
            tx.CommitTransaction()

            Return ventas.CodVenta

        Catch ex As Exception
            tx.RollbackTransaction()
            MessageError = ex
            Return 0
        End Try

    End Function

    Public Function Update_Ventas(conn As String, codVenta As Integer,
                                     nroFactura As String, fecha As DateTime, vto As String, tipoVenta As String,
                                  estadoVenta As String, totalVenta As Decimal, totalSaldo As Decimal, totalIva As Decimal,
                                  codCliente As Integer, codVendedor As Integer, codUsuario As Integer, confirmar As Boolean,
                                  descto As Decimal) As Boolean

        Dim tx As TransactionMgr
        tx = TransactionMgr.ThreadTransactionMgr()

        Try
            tx.BeginTransaction()

            Dim ventas As New Class_RC_Data.Class_RC.VENTAS(conn)
            ventas.Where.CodVenta.Value = codVenta

            If ventas.Query.Load Then

                'Registro anterior
                log__1.Insert_Log(conn, "Actualizar registro anterior, codigo: " & codVenta, codUsuario, 2, ventas.DefaultView.Table)

                If nroFactura = "" And confirmar Then
                    nroFactura = get_Rango_Factura(conn)
                End If

                ventas.NroFactura = nroFactura

                ventas.Fecha = fecha

                If vto <> "" Then
                    ventas.Vencimiento = DateTime.Parse(vto)
                End If

                ventas.TipoVenta = tipoVenta
                ventas.EstadoVenta = estadoVenta
                ventas.TotalVenta = totalVenta
                ventas.TotalVentaIVA = totalIva
                ventas.Descto = descto

                If tipoVenta = "CONTADO" Then
                    ventas.TotalVentaSaldo = 0
                Else
                    ventas.TotalVentaSaldo = ventas.TotalVenta
                End If

                ventas.CodCliente = codCliente
                ventas.CodVendedor = codVendedor
                ventas.CodUsuario = codUsuario
                ventas.FechaActualizacion = DateTime.Now
                ventas.Save()

            End If

            'Registro editado
            log__1.Insert_Log(conn, "Actualizar registro editado, codigo: " & codVenta, codUsuario, 2, ventas.DefaultView.Table)

            tx.CommitTransaction()
            Return True

        Catch ex As Exception
            tx.RollbackTransaction()
            MessageError = ex
            Return False
        End Try

    End Function

    Public Function get_Rango_Remision(conn As String) As String
        Try

            Dim rango As New Class_RC_Data.Class_RC.RANGODOCUMENTOS(conn)
            Dim numero As String = ""
            rango.Where.TipoDocumento.Value = "REMISION"
            rango.Where.Habilitado.Value = True

            If rango.Query.Load Then
                If rango.DefaultView.Table.Rows.Count > 0 Then

                    numero = rango.Prefijo.ToString() + rango.RangoActual.ToString().PadLeft(7, "0")
                    rango.RangoActual += 1
                    rango.Save()

                    Return numero
                Else
                    Return ""
                End If

            Else
                Return ""

            End If

        Catch ex As Exception
            MessageError = ex
            Return ""
        End Try

    End Function

    Public Function Update_Ventas(conn As String, codVenta As Integer, codUsuario As Integer) As Boolean

        Dim tx As TransactionMgr
        tx = TransactionMgr.ThreadTransactionMgr()

        Try
            tx.BeginTransaction()

            Dim ventas As New Class_RC_Data.Class_RC.VENTAS(conn)
            ventas.Where.CodVenta.Value = codVenta

            If ventas.Query.Load Then

                ventas.NroRemision = get_Rango_Remision(conn)
                ventas.CodUsuario = codUsuario
                ventas.FechaActualizacion = DateTime.Now
                ventas.Save()

            End If

            tx.CommitTransaction()
            Return True

        Catch ex As Exception
            tx.RollbackTransaction()
            MessageError = ex
            Return False
        End Try

    End Function

    Public Function Update_Ventas_Impresion(conn As String, codVenta As Integer, codUsuario As Integer) As Boolean

        Dim tx As TransactionMgr
        tx = TransactionMgr.ThreadTransactionMgr()

        Try
            tx.BeginTransaction()

            Dim ventas As New Class_RC_Data.Class_RC.VENTAS(conn)
            ventas.Where.CodVenta.Value = codVenta

            If ventas.Query.Load Then

                ventas.Impresa = True
                ventas.CodUsuario = codUsuario
                ventas.FechaActualizacion = DateTime.Now
                ventas.Save()

            End If

            tx.CommitTransaction()
            Return True

        Catch ex As Exception
            tx.RollbackTransaction()
            MessageError = ex
            Return False
        End Try

    End Function

    Public Function Update_Ventas_Estado(conn As String, codVenta As Integer, estadoVenta As String, codUsuario As Integer) As Boolean

        Dim tx As TransactionMgr
        tx = TransactionMgr.ThreadTransactionMgr()

        Try
            tx.BeginTransaction()

            Dim ventas As New Class_RC_Data.Class_RC.VENTAS(conn)
            ventas.Where.CodVenta.Value = codVenta

            If ventas.Query.Load Then
                ventas.EstadoVenta = estadoVenta
                ventas.SetColumnNull("codNota")
                ventas.CodUsuario = codUsuario
                ventas.FechaActualizacion = DateTime.Now
                ventas.Save()

                If estadoVenta = "ANULADA" Then

                    Dim detalle As New Class_RC_Data.Class_RC.DETALLEVENTAS(conn)
                    detalle.Where.CodVenta.Value = codVenta
                    If detalle.Query.Load Then

                        For i As Integer = 0 To detalle.DefaultView.Table.Rows.Count - 1

                            Dim producto As New Class_RC_Data.Class_RC.PRODUCTOS(conn)
                            producto.Where.CodProducto.Value = detalle.DefaultView.Table.Rows(i)("CodProducto")
                            If producto.Query.Load Then
                                producto.CantExistente += detalle.DefaultView.Table.Rows(i)("cantidad")
                                producto.CodUsuario = codUsuario
                                producto.FechaActualizacion = DateTime.Now
                                producto.Save()
                            End If

                        Next

                    End If

                End If

            End If

            tx.CommitTransaction()
            Return True

        Catch ex As Exception
            tx.RollbackTransaction()
            MessageError = ex
            Return False
        End Try

    End Function

    Public Function Delete_Ventas(conn As String, codVenta As Integer, codUsuario As Integer) As Boolean

        Dim tx As TransactionMgr
        tx = TransactionMgr.ThreadTransactionMgr()

        Try
            tx.BeginTransaction()

            Dim venta As New Class_RC_Data.Class_RC.VENTAS(conn)
            venta.Where.CodVenta.Value = codVenta

            If venta.Query.Load Then

                'Registro eliminado
                log__1.Insert_Log(conn, "Eliminar registro, codigo: " & codVenta, codUsuario, 3, venta.DefaultView.Table)

                Dim detalle As New Class_RC_Data.Class_RC.DETALLEVENTAS(conn)
                detalle.Where.CodVenta.Value = codVenta
                If detalle.Query.Load Then

                    'Registros detalle eliminados
                    log__1.Insert_Log(conn, "Eliminar registro detalle, codigo: " & codVenta, codUsuario, 3, detalle.DefaultView.Table)

                    For i As Integer = 0 To detalle.DefaultView.Table.Rows.Count - 1

                        Dim producto As New Class_RC_Data.Class_RC.PRODUCTOS(conn)
                        producto.Where.CodProducto.Value = detalle.DefaultView.Table.Rows(i)("CodProducto")
                        If producto.Query.Load Then
                            producto.CantExistente += detalle.DefaultView.Table.Rows(i)("cantidad")
                            producto.CodUsuario = codUsuario
                            producto.FechaActualizacion = DateTime.Now
                            producto.Save()
                        End If

                    Next

                End If

                venta.MarkAsDeleted()
                venta.Save()

            End If

            tx.CommitTransaction()
            Return True

        Catch ex As Exception
            tx.RollbackTransaction()
            MessageError = ex
            Return False
        End Try

    End Function

    Public Function get_Ventas_All(conn As String, codVenta As Integer, fechaInicio As DateTime,
                                   fechaFin As DateTime, tipoVenta As String, cliente As String,
                                   estado As String, nroFactura As String, ruc As String,
                                   vendedor As String, codCliente As Integer, conSaldo As Boolean,
                                   productoSaldo As Boolean) As DataTable
        Try

            Dim vVentas As New Class_RC_Data.Class_RC.VistaVentas(conn)
            Dim vVentasPro As New Class_RC_Data.Class_RC.VistaVentas_Productos_Saldo(conn)

            If codVenta > 0 Then
                vVentas.Where.CodVenta.Value = codVenta
                vVentasPro.Where.CodVenta.Value = codVenta
            End If

            If codCliente > 0 Then
                vVentas.Where.CodCliente.Value = codCliente
                vVentasPro.Where.CodCliente.Value = codCliente
            End If

            If vendedor <> "" Then
                vVentas.Where.Vendedor.Value = vendedor
                vVentasPro.Where.Vendedor.Value = vendedor
            End If

            If nroFactura <> "" Then
                vVentas.Where.NroFactura.Value = "%" & nroFactura & "%"
                vVentas.Where.NroFactura.Operator = WhereParameter.Operand.Like

                vVentasPro.Where.NroFactura.Value = "%" & nroFactura & "%"
                vVentasPro.Where.NroFactura.Operator = WhereParameter.Operand.Like
            Else
                vVentas.Where.Fecha.BetweenBeginValue = New DateTime(fechaInicio.Year, fechaInicio.Month, fechaInicio.Day, 0, 0, 0)
                vVentas.Where.Fecha.BetweenEndValue = New DateTime(fechaFin.Year, fechaFin.Month, fechaFin.Day, 23, 59, 59)
                vVentas.Where.Fecha.Operator = WhereParameter.Operand.Between

                vVentasPro.Where.Fecha.BetweenBeginValue = New DateTime(fechaInicio.Year, fechaInicio.Month, fechaInicio.Day, 0, 0, 0)
                vVentasPro.Where.Fecha.BetweenEndValue = New DateTime(fechaFin.Year, fechaFin.Month, fechaFin.Day, 23, 59, 59)
                vVentasPro.Where.Fecha.Operator = WhereParameter.Operand.Between
            End If

            If tipoVenta <> "" Then
                vVentas.Where.TipoVenta.Value = tipoVenta
                vVentasPro.Where.TipoVenta.Value = tipoVenta
            End If

            If estado <> "" Then
                vVentas.Where.EstadoVenta.Value = estado
                vVentasPro.Where.EstadoVenta.Value = estado
            End If

            If cliente <> "" Then
                vVentas.Where.Cliente.Value = "%" + cliente + "%"
                vVentas.Where.Cliente.Operator = WhereParameter.Operand.Like

                vVentasPro.Where.Cliente.Value = "%" + cliente + "%"
                vVentasPro.Where.Cliente.Operator = WhereParameter.Operand.Like
            End If

            If ruc <> "" Then
                vVentas.Where.Ruc.Value = "%" + ruc + "%"
                vVentas.Where.Ruc.Operator = WhereParameter.Operand.Like

                vVentasPro.Where.Ruc.Value = "%" + ruc + "%"
                vVentasPro.Where.Ruc.Operator = WhereParameter.Operand.Like
            End If

            If conSaldo Then
                vVentas.Where.TotalVentaSaldo.Value = 0
                vVentas.Where.TotalVentaSaldo.Operator = WhereParameter.Operand.GreaterThan

                vVentasPro.Where.TotalVentaSaldo.Value = 0
                vVentasPro.Where.TotalVentaSaldo.Operator = WhereParameter.Operand.GreaterThan
            End If

            vVentas.Query.AddOrderBy("fecha", WhereParameter.Dir.DESC)
            vVentasPro.Query.AddOrderBy("fecha", WhereParameter.Dir.DESC)

            If productoSaldo Then

                If vVentasPro.Query.Load Then
                    If vVentasPro.DefaultView.Table.Rows.Count > 0 Then
                        Return vVentasPro.DefaultView.Table
                    Else
                        Return Nothing
                    End If

                Else
                    Return Nothing

                End If

            Else

                If vVentas.Query.Load Then
                    If vVentas.DefaultView.Table.Rows.Count > 0 Then
                        Return vVentas.DefaultView.Table
                    Else
                        Return Nothing
                    End If

                Else
                    Return Nothing

                End If

            End If

        Catch ex As Exception
            MessageError = ex
            Return Nothing
        End Try

    End Function

    Public Function get_Ventas_ByID(conn As String, codVenta As Integer) As DataTable
        Try

            Dim vVentas As New Class_RC_Data.Class_RC.VistaVentas(conn)

            If codVenta > 0 Then
                vVentas.Where.CodVenta.Value = codVenta
            End If

            If vVentas.Query.Load Then
                If vVentas.DefaultView.Table.Rows.Count > 0 Then
                    Return vVentas.DefaultView.Table
                Else
                    Return Nothing
                End If

            Else
                Return Nothing

            End If

        Catch ex As Exception
            MessageError = ex
            Return Nothing
        End Try

    End Function

    Public Function get_Ventas_Mes(conn As String, anhio As Integer, mes As Integer) As DataTable
        Try

            Dim vVentas As New Class_RC_Data.Class_RC.Vista_Ventas_Mensual(conn)

            vVentas.Where.Anhio.Value = anhio
            'vVentas.Where.Anhio.Operator = WhereParameter.Operand.GreaterThanOrEqual

            vVentas.Where.Mes.Value = mes
            vVentas.Where.Mes.Operator = WhereParameter.Operand.LessThanOrEqual

            vVentas.Query.AddOrderBy("Anhio", WhereParameter.Dir.ASC)
            vVentas.Query.AddOrderBy("mes", WhereParameter.Dir.ASC)

            If vVentas.Query.Load Then

                If vVentas.DefaultView.Table.Rows.Count > 0 Then
                    Return vVentas.DefaultView.Table
                Else
                    Return Nothing
                End If

            Else
                Return Nothing

            End If

        Catch ex As Exception
            MessageError = ex
            Return Nothing
        End Try

    End Function

    Public Function get_Compras_Mes(conn As String, anhio As Integer, mes As Integer) As DataTable
        Try

            Dim vVentas As New Class_RC_Data.Class_RC.Vista_Compras_Mensual(conn)

            vVentas.Where.Anhio.Value = anhio
            'vVentas.Where.Anhio.Operator = WhereParameter.Operand.GreaterThanOrEqual

            vVentas.Where.Mes.Value = mes
            vVentas.Where.Mes.Operator = WhereParameter.Operand.LessThanOrEqual

            vVentas.Query.AddOrderBy("Anhio", WhereParameter.Dir.ASC)
            vVentas.Query.AddOrderBy("mes", WhereParameter.Dir.ASC)

            If vVentas.Query.Load Then
                If vVentas.DefaultView.Table.Rows.Count > 0 Then
                    Return vVentas.DefaultView.Table
                Else
                    Return Nothing
                End If

            Else
                Return Nothing

            End If

        Catch ex As Exception
            MessageError = ex
            Return Nothing
        End Try

    End Function

    Public Function get_Ventas_Producto_ByID(conn As String, codVenta As Integer) As DataTable
        Try

            Dim vVentas As New Class_RC_Data.Class_RC.VistaVentas_Productos(conn)

            If codVenta > 0 Then
                vVentas.Where.CodVenta.Value = codVenta
            End If

            If vVentas.Query.Load Then
                If vVentas.DefaultView.Table.Rows.Count > 0 Then
                    Return vVentas.DefaultView.Table
                Else
                    Return Nothing
                End If

            Else
                Return Nothing

            End If

        Catch ex As Exception
            MessageError = ex
            Return Nothing
        End Try

    End Function

    Public Function Insert_Ventas_Detalle(conn As String, codVenta As Integer, codProducto As Integer, cantidad As Decimal,
                                          precio As Decimal, iva As Decimal, ivaMonto As Decimal, total As Decimal,
                                          codCliente As Integer, condicion As String, codUsuario As Integer,
                                          codServicio As Integer) As Boolean

        Dim tx As TransactionMgr
        tx = TransactionMgr.ThreadTransactionMgr()

        Try
            tx.BeginTransaction()

            If condicion = "CREDITO" Then
                Dim cliente As New Class_RC_Data.Class_RC.VistaClientes(conn)
                cliente.Where.CodCliente.Value = codCliente
                If cliente.Query.Load Then
                    If (cliente.Saldo + total) > cliente.Limitecredito Then
                        Delete_Ventas(conn, codVenta, codUsuario)
                        Throw New Exception("Favor verificar el limite de credito del cliente, superara el mismo.")
                    End If
                End If
            End If

            Dim producto As New Class_RC_Data.Class_RC.PRODUCTOS(conn)
            producto.Where.CodProducto.Value = codProducto
            If producto.Query.Load Then
                If producto.CantExistente < cantidad Then
                    Delete_Ventas(conn, codVenta, codUsuario)
                    Throw New Exception("El Producto solicitado no exite en la cantidad solicitada, o el pedido no ha sido ingresados al Deposito.")
                Else
                    producto.CantExistente -= cantidad
                    producto.CodUsuario = codUsuario
                    producto.FechaActualizacion = DateTime.Now
                    producto.Save()

                End If
            End If

            Dim detalle As New Class_RC_Data.Class_RC.DETALLEVENTAS(conn)
            detalle.AddNew()
            detalle.CodVenta = codVenta
            detalle.CodProducto = codProducto
            detalle.Cantidad = cantidad
            detalle.Precio = precio
            detalle.Iva = iva
            detalle.IvaMonto = ivaMonto
            detalle.Total = total

            If codServicio > 0 Then
                detalle.CodServicio = codServicio
            Else
                detalle.SetColumnNull("CodServicio")
            End If

            detalle.Save()

            Dim venta As New Class_RC_Data.Class_RC.VENTAS(conn)
            venta.Where.CodVenta.Value = codVenta
            If venta.Query.Load Then
                venta.TotalVenta += detalle.Total
                venta.TotalVentaIVA += detalle.IvaMonto
                venta.TotalVentaSaldo += detalle.Total
                venta.CodUsuario = codUsuario
                venta.FechaActualizacion = DateTime.Now
                venta.Save()
            End If


            
            tx.CommitTransaction()

            Return True

        Catch ex As Exception
            tx.RollbackTransaction()

            If ex.Message.Contains("PK_DETALLEVENTAS") Then
                MessageError = New Exception("No puede ingresar el mismo producto existente, favor verifique.")
            Else
                MessageError = ex
            End If

            Return False

        End Try

    End Function

    Public Function Delete_Ventas_Detalle(conn As String, codVenta As Integer,
                                          codProducto As Integer, codUsuario As Integer,
                                          codServicio As Integer) As Boolean

        Dim tx As TransactionMgr
        tx = TransactionMgr.ThreadTransactionMgr()

        Try
            tx.BeginTransaction()

            Dim detalle As New Class_RC_Data.Class_RC.DETALLEVENTAS(conn)

            If codProducto > 0 Then
                detalle.Where.CodProducto.Value = codProducto
            End If

            If codServicio > 0 Then
                detalle.Where.CodServicio.Value = codServicio
            End If

            detalle.Where.CodVenta.Value = codVenta
            If detalle.Query.Load Then

                Dim venta As New Class_RC_Data.Class_RC.VENTAS(conn)
                venta.Where.CodVenta.Value = codVenta
                If venta.Query.Load Then
                    venta.TotalVenta -= detalle.Total
                    venta.TotalVentaIVA -= detalle.IvaMonto
                    venta.TotalVentaSaldo -= detalle.Total
                    venta.CodUsuario = codUsuario
                    venta.FechaActualizacion = DateTime.Now
                    venta.Save()
                End If

                'Dim producto As New Class_RC_Data.Class_RC.PRODUCTOS(conn)
                'producto.Where.CodProducto.Value = codProducto
                'If producto.Query.Load Then
                '    producto.CantExistente += detalle.Cantidad
                '    producto.CodUsuario = codUsuario
                '    producto.FechaActualizacion = DateTime.Now
                '    producto.Save()
                'End If

                detalle.MarkAsDeleted()
                detalle.Save()

            End If

            tx.CommitTransaction()

            Return True

        Catch ex As Exception
            tx.RollbackTransaction()
            MessageError = ex
            Return False
        End Try

    End Function

    Public Function get_Ventas_Detalles_All(conn As String, codVenta As Integer,
                                            soloSaldo As Boolean, soloProducto As Boolean) As DataTable
        Try

            Dim vDetalle As New Class_RC_Data.Class_RC.VistaVentasDetalle(conn)

            If codVenta > 0 Then
                vDetalle.Where.CodVenta.Value = codVenta
            End If

            If soloSaldo Then
                vDetalle.Where.Saldo.Value = 0
                vDetalle.Where.Saldo.Operator = WhereParameter.Operand.GreaterThan
            End If

            If soloProducto Then
                vDetalle.Where.CodServicio.Value = 0
                vDetalle.Where.CodServicio.Operator = WhereParameter.Operand.IsNull
            End If

            'If descripcion <> "" Then
            '    vPro.Where.DescProducto.Value = "%" & descripcion & "%"
            '    vPro.Where.DescProducto.Operator = WhereParameter.Operand.Like
            'End If

            'If codTipoProducto > 0 Then
            '    vPro.Where.CodTipoProducto.Value = codTipoProducto
            'End If

            vDetalle.Query.AddOrderBy("codVenta", WhereParameter.Dir.ASC)

            If vDetalle.Query.Load Then
                If vDetalle.DefaultView.Table.Rows.Count > 0 Then
                    Return vDetalle.DefaultView.Table
                Else
                    Return Nothing
                End If

            Else
                Return Nothing

            End If

        Catch ex As Exception
            MessageError = ex
            Return Nothing
        End Try

    End Function

    Public Function get_FacturasVencidas_All(ByVal conn As String, ByVal cliente As String, ByVal ruc As String) As DataTable
        Try
            Dim vVentas As New Class_RC_Data.Class_RC.VistaFacturasVencidas(conn)
            If cliente <> "" Then
                vVentas.Where.Nombre.Value = "%" + cliente + "%"
                vVentas.Where.Nombre.Operator = WhereParameter.Operand.Like
            End If

            If ruc <> "" Then
                vVentas.Where.Ruc.Value = "%" + ruc + "%"
                vVentas.Where.Ruc.Operator = WhereParameter.Operand.Like
            End If

            If vVentas.Query.Load Then
                If vVentas.DefaultView.Table.Rows.Count > 0 Then
                    Return vVentas.DefaultView.Table
                Else
                    Return Nothing
                End If

            Else
                Return Nothing

            End If

        Catch ex As Exception
            MessageError = ex
            Return Nothing
        End Try

    End Function

#End Region

#Region "Compras"

    Public Function Insert_Compras(conn As String, nroFactura As String, fecha As DateTime, vto As String, tipoCompra As String,
                                  estadoCompra As String, totalCompra As Decimal, totalSaldo As Decimal, totalIva As Decimal,
                                  codProveedor As Integer, codUsuario As Integer, codOrden As Integer) As Integer

        Dim tx As TransactionMgr

        tx = TransactionMgr.ThreadTransactionMgr()

        Try
            tx.BeginTransaction()

            Dim ventas As New Class_RC_Data.Class_RC.COMPRAS(conn)

            ventas.AddNew()

            ventas.NroFactura = nroFactura

            ventas.Fecha = fecha

            If vto <> "" Then
                ventas.Vencimiento = DateTime.Parse(vto)
            End If

            ventas.TipoCompra = tipoCompra
            ventas.EstadoCompra = estadoCompra
            ventas.TotalCompra = totalCompra
            ventas.TotalCompraIVA = totalIva

            If tipoCompra = "CONTADO" Then
                ventas.TotalCompraSaldo = 0
            Else
                ventas.TotalCompraSaldo = ventas.TotalCompra
            End If

            ventas.CodProveedor = codProveedor
            ventas.CodUsuario = codUsuario
            ventas.FechaActualizacion = DateTime.Now

            If codOrden > 0 Then
                ventas.CodOrden = codOrden
            Else
                ventas.SetColumnNull("CodOrden")
            End If

            ventas.Save()

            tx.CommitTransaction()

            Return ventas.CodCompra

        Catch ex As Exception
            tx.RollbackTransaction()
            MessageError = ex
            Return 0
        End Try

    End Function

    Public Function Update_Compras(conn As String, codCompra As Integer,
                                     nroFactura As String, fecha As DateTime, vto As String, tipoCompra As String,
                                  estadoCompra As String, totalCompra As Decimal, totalSaldo As Decimal, totalIva As Decimal,
                                  codProveedor As Integer, codUsuario As Integer, codOrden As Integer) As Boolean

        Dim tx As TransactionMgr
        tx = TransactionMgr.ThreadTransactionMgr()

        Try
            tx.BeginTransaction()

            Dim ventas As New Class_RC_Data.Class_RC.COMPRAS(conn)
            ventas.Where.CodCompra.Value = codCompra

            If ventas.Query.Load Then

                ventas.NroFactura = nroFactura

                ventas.Fecha = fecha

                If vto <> "" Then
                    ventas.Vencimiento = DateTime.Parse(vto)
                End If

                ventas.TipoCompra = tipoCompra
                ventas.EstadoCompra = estadoCompra
                ventas.TotalCompra = totalCompra
                ventas.TotalCompraIVA = totalIva

                If tipoCompra = "CONTADO" Then
                    ventas.TotalCompraSaldo = 0
                Else
                    ventas.TotalCompraSaldo = ventas.TotalCompra
                End If

                ventas.CodProveedor = codProveedor

                ventas.CodUsuario = codUsuario
                ventas.FechaActualizacion = DateTime.Now
                ventas.Save()

            End If

            tx.CommitTransaction()
            Return True

        Catch ex As Exception
            tx.RollbackTransaction()
            MessageError = ex
            Return False
        End Try

    End Function

    Public Function Update_Compras_Estado(conn As String, codCompra As Integer, estadoCompra As String, codUsuario As Integer) As Boolean

        Dim tx As TransactionMgr
        tx = TransactionMgr.ThreadTransactionMgr()

        Try
            tx.BeginTransaction()

            Dim compras As New Class_RC_Data.Class_RC.COMPRAS(conn)
            compras.Where.CodCompra.Value = codCompra

            If compras.Query.Load Then
                compras.EstadoCompra = estadoCompra
                compras.CodUsuario = codUsuario
                compras.FechaActualizacion = DateTime.Now
                compras.SetColumnNull("codOrden")
                compras.Save()

                If estadoCompra = "ANULADA" Then

                    Dim detalle As New Class_RC_Data.Class_RC.DETALLECOMPRAS(conn)
                    detalle.Where.CodCompra.Value = codCompra
                    If detalle.Query.Load Then

                        For i As Integer = 0 To detalle.DefaultView.Table.Rows.Count - 1

                            Dim producto As New Class_RC_Data.Class_RC.MATERIALES(conn)
                            producto.Where.CodMaterial.Value = detalle.DefaultView.Table.Rows(i)("CodMaterial")
                            If producto.Query.Load Then
                                producto.CantExistente += detalle.DefaultView.Table.Rows(i)("cantidad")
                                producto.CodUsuario = codUsuario
                                producto.FechaActualizacion = DateTime.Now
                                producto.Save()
                            End If

                        Next

                    End If

                End If

            End If

            tx.CommitTransaction()
            Return True

        Catch ex As Exception
            tx.RollbackTransaction()
            MessageError = ex
            Return False
        End Try

    End Function

    Public Function Delete_Compras(conn As String, codCompra As Integer, codUsuario As Integer) As Boolean

        Dim tx As TransactionMgr
        tx = TransactionMgr.ThreadTransactionMgr()

        Try
            tx.BeginTransaction()

            Dim compras As New Class_RC_Data.Class_RC.COMPRAS(conn)
            compras.Where.CodCompra.Value = codCompra

            If compras.Query.Load Then

                Dim detalle As New Class_RC_Data.Class_RC.DETALLECOMPRAS(conn)
                detalle.Where.CodCompra.Value = codCompra
                If detalle.Query.Load Then

                    For i As Integer = 0 To detalle.DefaultView.Table.Rows.Count - 1

                        Dim producto As New Class_RC_Data.Class_RC.MATERIALES(conn)
                        producto.Where.CodMaterial.Value = detalle.DefaultView.Table.Rows(i)("CodMaterial")
                        If producto.Query.Load Then
                            producto.CantExistente += detalle.DefaultView.Table.Rows(i)("cantidad")
                            producto.CodUsuario = codUsuario
                            producto.FechaActualizacion = DateTime.Now
                            producto.Save()
                        End If

                    Next

                End If

                compras.MarkAsDeleted()
                compras.Save()

            End If

            tx.CommitTransaction()
            Return True

        Catch ex As Exception
            tx.RollbackTransaction()
            MessageError = ex
            Return False
        End Try

    End Function

    Public Function get_Compras_All(conn As String, codCompra As Integer, fechaInicio As DateTime,
                                   fechaFin As DateTime, tipoCompra As String, proveedor As String,
                                   estado As String, nroFactura As String, ruc As String,
                                   codProveedor As Integer, conSaldo As Boolean) As DataTable
        Try

            Dim vCompras As New Class_RC_Data.Class_RC.VistaCompras(conn)

            If codCompra > 0 Then
                vCompras.Where.CodCompra.Value = codCompra
            End If

            If codProveedor > 0 Then
                vCompras.Where.CodProveedor.Value = codProveedor
            End If

            If nroFactura <> "" Then
                vCompras.Where.NroFactura.Value = "%" & nroFactura & "%"
                vCompras.Where.NroFactura.Operator = WhereParameter.Operand.Like
            Else
                vCompras.Where.Fecha.BetweenBeginValue = New DateTime(fechaInicio.Year, fechaInicio.Month, fechaInicio.Day, 0, 0, 0)
                vCompras.Where.Fecha.BetweenEndValue = New DateTime(fechaFin.Year, fechaFin.Month, fechaFin.Day, 23, 59, 59)
                vCompras.Where.Fecha.Operator = WhereParameter.Operand.Between
            End If

            If tipoCompra <> "" Then
                vCompras.Where.TipoCompra.Value = tipoCompra
            End If

            If estado <> "" Then
                vCompras.Where.EstadoCompra.Value = estado
            End If

            If proveedor <> "" Then
                vCompras.Where.Proveedor.Value = "%" + proveedor + "%"
                vCompras.Where.Proveedor.Operator = WhereParameter.Operand.Like
            End If

            If ruc <> "" Then
                vCompras.Where.Ruc.Value = "%" + ruc + "%"
                vCompras.Where.Ruc.Operator = WhereParameter.Operand.Like
            End If

            If conSaldo Then
                vCompras.Where.TotalCompraSaldo.Value = 0
                vCompras.Where.TotalCompraSaldo.Operator = WhereParameter.Operand.GreaterThan
            End If

            vCompras.Query.AddOrderBy("fecha", WhereParameter.Dir.DESC)

            If vCompras.Query.Load Then
                If vCompras.DefaultView.Table.Rows.Count > 0 Then
                    Return vCompras.DefaultView.Table
                Else
                    Return Nothing
                End If

            Else
                Return Nothing

            End If

        Catch ex As Exception
            MessageError = ex
            Return Nothing
        End Try

    End Function

    Public Function get_Compras_ByID(conn As String, codCompra As Integer) As DataTable
        Try

            Dim vCompras As New Class_RC_Data.Class_RC.VistaCompras(conn)

            If codCompra > 0 Then
                vCompras.Where.CodCompra.Value = codCompra
            End If

            If vCompras.Query.Load Then
                If vCompras.DefaultView.Table.Rows.Count > 0 Then
                    Return vCompras.DefaultView.Table
                Else
                    Return Nothing
                End If

            Else
                Return Nothing

            End If

        Catch ex As Exception
            MessageError = ex
            Return Nothing
        End Try

    End Function

    'Public Function get_Compras_Material_ByID(conn As String, codCompra As Integer) As DataTable
    '    Try

    '        Dim vCompras As New Class_RC_Data.Class_RC.Vista(conn)

    '        If codVenta > 0 Then
    '            vCompras.Where.CodVenta.Value = codVenta
    '        End If

    '        If vCompras.Query.Load Then
    '            If vCompras.DefaultView.Table.Rows.Count > 0 Then
    '                Return vCompras.DefaultView.Table
    '            Else
    '                Return Nothing
    '            End If

    '        Else
    '            Return Nothing

    '        End If

    '    Catch ex As Exception
    '        MessageError = ex
    '        Return Nothing
    '    End Try

    'End Function

    'Public Function Update_Compras_Detalle(conn As String, codCompra As Integer, codMaterial As Integer, cantidad As Decimal,
    '                                      precio As Decimal, iva As Decimal, ivaMonto As Decimal, total As Decimal) As Boolean

    '    Dim tx As TransactionMgr
    '    tx = TransactionMgr.ThreadTransactionMgr()

    '    Try
    '        tx.BeginTransaction()

    '        Dim detalle As New Class_RC_Data.Class_RC.DETALLECOMPRAS(conn)
    '        detalle.Where.CodCompra.Value = codCompra
    '        detalle.Where.CodMaterial.Value = codMaterial

    '        If detalle.Query.Load Then

    '            detalle.Cantidad = cantidad
    '            detalle.Precio = precio
    '            detalle.Iva = iva
    '            detalle.IvaMonto = ivaMonto
    '            detalle.Total = total
    '            detalle.Save()

    '        Else

    '            detalle.AddNew()
    '            detalle.CodCompra = codCompra
    '            detalle.CodMaterial = codMaterial
    '            detalle.Cantidad = cantidad
    '            detalle.Precio = precio
    '            detalle.Iva = iva
    '            detalle.IvaMonto = ivaMonto
    '            detalle.Total = total
    '            detalle.Save()

    '        End If

    '        tx.CommitTransaction()

    '        Return True

    '    Catch ex As Exception
    '        tx.RollbackTransaction()
    '        MessageError = ex
    '        Return False
    '    End Try

    'End Function

    Public Function Insert_Compras_Detalle(conn As String, codCompra As Integer, codProducto As Integer, cantidad As Decimal,
                                          precio As Decimal, iva As Decimal, ivaMonto As Decimal, total As Decimal,
                                          codProveedor As Integer, condicion As String, codUsuario As Integer,
                                          codOrden As Integer) As Boolean

        Dim tx As TransactionMgr
        tx = TransactionMgr.ThreadTransactionMgr()

        Try
            tx.BeginTransaction()

            Dim detalle As New Class_RC_Data.Class_RC.DETALLECOMPRAS(conn)
            detalle.Where.CodCompra.Value = codCompra
            detalle.Where.CodMaterial.Value = codProducto

            If Not detalle.Query.Load Then

                If codOrden > 0 Then
                    Throw New Exception("Solo puede ingresar materiales definidos en la orden de compra")
                End If

                detalle.AddNew()

            End If

            detalle.CodCompra = codCompra
            detalle.CodMaterial = codProducto
            detalle.Cantidad = cantidad
            detalle.Precio = precio
            detalle.Iva = iva
            detalle.IvaMonto = ivaMonto
            detalle.Total = total
            detalle.Save()

            If detalle.Precio > 0 Then
                Dim detamaterial As New Class_RC_Data.Class_RC.DETALLEMATERIAL(conn)
                detamaterial.Where.CodMaterial.Value = codProducto
                If detamaterial.Query.Load Then
                    detamaterial.CantExistente += CDec(detamaterial.CantUnidadMaterial * cantidad)
                    detamaterial.CostoUnidad = (precio / detamaterial.CantUnidadMaterial)
                    detamaterial.Save()
                End If

                Dim material As New Class_RC_Data.Class_RC.MATERIALES(conn)
                material.Where.CodMaterial.Value = codProducto
                If material.Query.Load Then
                    material.CantExistente += cantidad
                    material.CostoMaterial = precio
                    material.CodUsuario = codUsuario
                    material.FechaActualizacion = DateTime.Now
                    material.Save()
                End If
            End If
            

            Dim venta As New Class_RC_Data.Class_RC.COMPRAS(conn)
            venta.Where.CodCompra.Value = codCompra
            If venta.Query.Load Then
                venta.TotalCompra += detalle.Total
                venta.TotalCompraIVA += detalle.IvaMonto
                venta.TotalCompraSaldo += detalle.Total
                venta.CodUsuario = codUsuario
                venta.FechaActualizacion = DateTime.Now
                venta.Save()
            End If

            tx.CommitTransaction()

            Return True

        Catch ex As Exception
            tx.RollbackTransaction()

            If ex.Message.Contains("PK_DETALLECOMPRAS") Then
                MessageError = New Exception("No puede ingresar el mismo material existente, favor verifique.")
            Else
                MessageError = ex
            End If

            Return False

        End Try

    End Function

    Public Function Delete_Compras_Detalle(conn As String, codCompra As Integer,
                                          codMaterial As Integer, codUsuario As Integer) As Boolean

        Dim tx As TransactionMgr
        tx = TransactionMgr.ThreadTransactionMgr()

        Try
            tx.BeginTransaction()

            Dim detalle As New Class_RC_Data.Class_RC.DETALLECOMPRAS(conn)

            detalle.Where.CodMaterial.Value = codMaterial
            detalle.Where.CodCompra.Value = codCompra
            If detalle.Query.Load Then

                Dim venta As New Class_RC_Data.Class_RC.COMPRAS(conn)
                venta.Where.CodCompra.Value = codCompra
                If venta.Query.Load Then
                    venta.TotalCompra -= detalle.Total
                    venta.TotalCompraIVA -= detalle.IvaMonto
                    venta.TotalCompraSaldo -= detalle.Total
                    venta.CodUsuario = codUsuario
                    venta.FechaActualizacion = DateTime.Now
                    venta.Save()
                End If

                Dim producto As New Class_RC_Data.Class_RC.MATERIALES(conn)
                producto.Where.CodMaterial.Value = codMaterial
                If producto.Query.Load Then
                    producto.CantExistente += detalle.Cantidad
                    producto.CodUsuario = codUsuario
                    producto.FechaActualizacion = DateTime.Now
                    producto.Save()
                End If

                detalle.MarkAsDeleted()
                detalle.Save()

            End If

            tx.CommitTransaction()

            Return True

        Catch ex As Exception
            tx.RollbackTransaction()
            MessageError = ex
            Return False
        End Try

    End Function

    Public Function get_Compras_Detalles_All(conn As String, codCompra As Integer) As DataTable
        Try

            Dim vDetalle As New Class_RC_Data.Class_RC.VistaComprasDetalle(conn)

            If codCompra > 0 Then
                vDetalle.Where.CodCompra.Value = codCompra
            End If

            'If descripcion <> "" Then
            '    vPro.Where.DescProducto.Value = "%" & descripcion & "%"
            '    vPro.Where.DescProducto.Operator = WhereParameter.Operand.Like
            'End If

            'If codTipoProducto > 0 Then
            '    vPro.Where.CodTipoProducto.Value = codTipoProducto
            'End If

            If vDetalle.Query.Load Then
                If vDetalle.DefaultView.Table.Rows.Count > 0 Then
                    Return vDetalle.DefaultView.Table
                Else
                    Return Nothing
                End If

            Else
                Return Nothing

            End If

        Catch ex As Exception
            MessageError = ex
            Return Nothing
        End Try

    End Function

    Public Function get_Compras_Detalles_ByID(conn As String, codCompra As Integer, codMaterial As Integer) As DataTable
        Try

            Dim vDetalle As New Class_RC_Data.Class_RC.VistaComprasDetalle(conn)

            vDetalle.Where.CodCompra.Value = codCompra
            vDetalle.Where.CodMaterial.Value = codMaterial


            If vDetalle.Query.Load Then
                If vDetalle.DefaultView.Table.Rows.Count > 0 Then
                    Return vDetalle.DefaultView.Table
                Else
                    Return Nothing
                End If

            Else
                Return Nothing

            End If

        Catch ex As Exception
            MessageError = ex
            Return Nothing
        End Try

    End Function

    Public Function get_ComprasVencidas_All(ByVal conn As String, ByVal proveedor As String, ByVal ruc As String) As DataTable
        Try
            Dim vCompras As New Class_RC_Data.Class_RC.VistaComprasVencidas(conn)
            If proveedor <> "" Then
                vCompras.Where.Nombre.Value = "%" + proveedor + "%"
                vCompras.Where.Nombre.Operator = WhereParameter.Operand.Like
            End If

            If ruc <> "" Then
                vCompras.Where.Ruc.Value = "%" + ruc + "%"
                vCompras.Where.Ruc.Operator = WhereParameter.Operand.Like
            End If

            If vCompras.Query.Load Then
                If vCompras.DefaultView.Table.Rows.Count > 0 Then
                    Return vCompras.DefaultView.Table
                Else
                    Return Nothing
                End If

            Else
                Return Nothing

            End If

        Catch ex As Exception
            MessageError = ex
            Return Nothing
        End Try

    End Function




#End Region

End Class
